# 按位与 &
print(5 & 7)  # 5
print("------")
"""
5和7的二进制分别为101与111
-------------
101
111
-----
101
同位置都为1，最终结果该位置才为1
"""

# 按位或 |
print(4 | 3)  # 7
"""
4和3的二进制分别为100和011,计算方法与按位与类似
------------
100
011
-------
111
同位置有1，输出结果该位置为1
111的十进制为7
"""
print("------")

# 按位异或 ^
print(3 ^ 5)  # 6
"""
3和5的二进制分别为011和101
----------
011
101
----
110
同位置数字相同则为0，数字不同则为1
"""
print("------")

# 按位取反~
"""
原码：二进制表示的有符号整数，最高位(首位)为符号位，0表示正数，1表示负数，其余为数值位，表示这个数的绝对值
举例：1和-1的原码分别为
001
101
补码：计算机存储数据时通常采用的编码方式，与原码同样表示为有符号整数
对于正数，补码就是原码本身
对于负数，补码为其对应正数的原码各位取反，然后末尾+1，符号位取1
举例：
3的原码是0011，所以3的补码也是0011
-3对应正数3的原码为0011，各位取反得到1100，末位+1得到1101
所以-3的补码为1101
按位取反：~x 对补码取反
若是正数，由于补码与原码相同，直接对原码进行取反，保留符号位再次取反，末位+1
若是负数，得先得出补码，再对补码进行取反
例如：分别对11和-11进行按位取反
11的原码和补码相同
001011 原码/补码
110100 取反
101011 保留符号位取反
101100 末位+1，最终十进制为-12
对于-11
001011 对应正数的原码
110100 各位取反
110101 末位+1，此为补码
001010 再次取反，得出最终结果10
"""
print(~11)
print(~(-11))
"""
按位取反的公式为
~x = -x - 1
"""